home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / kernel / dev / ds5000.md / devDC7085.c < prev    next >
Text File  |  1992-12-18  |  24KB  |  940 lines

  1. /* 
  2.  *  devDC7085.c --
  3.  *
  4.  *         This file contains machine-dependent routines that handle the
  5.  *    output queue for the serial lines.
  6.  *
  7.  *    Copyright (C) 1989 Digital Equipment Corporation.
  8.  *    Permission to use, copy, modify, and distribute this software and
  9.  *    its documentation for any purpose and without fee is hereby granted,
  10.  *    provided that the above copyright notice appears in all copies.  
  11.  *    Digital Equipment Corporation makes no representations about the
  12.  *    suitability of this software for any purpose.  It is provided "as is"
  13.  *    without express or implied warranty.
  14.  */
  15.  
  16. #ifndef lint
  17. static char rcsid[] = "$Header: /cdrom/src/kernel/Cvsroot/kernel/dev/ds5000.md/devDC7085.c,v 1.4 92/05/22 13:13:58 shirriff Exp $ SPRITE (DECWRL)";
  18. #endif not lint
  19.  
  20. #include "sprite.h"
  21. #include "machMon.h"
  22. #include "mach.h"
  23. #include "dev.h"
  24. #include "fs.h"
  25. #include "sys.h"
  26. #include "sync.h"
  27. #include "timer.h"
  28. #include "dbg.h"
  29. #include "dc7085.h"
  30. #include "graphics.h"
  31. #include "machAddrs.h"
  32. #include "console.h"
  33. #include <sgtty.h>
  34.  
  35. static Sync_Semaphore dc7085Mutex = Sync_SemInitStatic("Dev:dc7085Mutex");
  36.  
  37. /*
  38.  * Define the six registers.
  39.  */
  40. #define REG_ADDR(offset) (unsigned short *)(MACH_DZ_ADDR + (offset))
  41. static volatile unsigned short *csrPtr =  REG_ADDR(0x00);
  42. static volatile unsigned short *rBufPtr = REG_ADDR(0x08);
  43. static volatile unsigned short *lprPtr =  REG_ADDR(0x08);
  44. static volatile unsigned short *tcrPtr =  REG_ADDR(0x10);
  45. #ifndef lint
  46. static volatile unsigned short *msrPtr =  REG_ADDR(0x18);
  47. #endif
  48. static volatile unsigned short *tdrPtr =  REG_ADDR(0x18);
  49.  
  50. /*
  51.  * The current status of the break bits.
  52.  */
  53. unsigned breakVal = 0;
  54.  
  55. /*
  56.  * Tables mapping sgttyb baud-rate values to actual integers and lpr register
  57.  * values.
  58.  */
  59. static struct {
  60.     int regVal;                /* Value to set in lpr register. */
  61.     int sgttybVal;            /* Baud value from sgtyb. */
  62.     int baud;                /* Integer baud rate. */
  63. } baudMap[] = {
  64.     {0, 0, 0},
  65.     {LPR_B50, B50, 50},
  66.     {LPR_B75, B75, 75},
  67.     {LPR_B110, B110, 110},
  68.     {LPR_B134, B134, 134},
  69.     {LPR_B150, B150, 150},
  70.     {-1, B200, 200},
  71.     {LPR_B300, B300, 300},
  72.     {LPR_B600, B600, 600},
  73.     {LPR_B1200, B1200, 1200},
  74.     {LPR_B2400, B2400, 2400},
  75.     {LPR_B4800, B4800, 4800},
  76.     {LPR_B9600, B9600, 9600}, 
  77.     {-1, -1, -1}
  78. };
  79.  
  80. /*
  81.  * Ascii values of command keys.
  82.  */
  83. #define KBD_TAB        '\t'
  84. #define KBD_DEL        127
  85. #define KBD_RET        '\r'
  86.  
  87. /*
  88.  *  Define "hardware-independent" codes for the control, shift, meta and 
  89.  *  function keys.  Codes start after the last 7-bit ASCII code (127)
  90.  *  and are assigned in an arbitrary order.
  91.  */
  92. #define KBD_NOKEY    128
  93. #define KBD_UNKNOWN    129
  94.  
  95. #define KBD_F1        201
  96. #define KBD_F2        202
  97. #define KBD_F3        203
  98. #define KBD_F4        204
  99. #define KBD_F5        205
  100. #define KBD_F6        206
  101. #define KBD_F7        207
  102. #define KBD_F8        208
  103. #define KBD_F9        209
  104. #define KBD_F10        210
  105. #define KBD_F11        211
  106. #define KBD_F12        212
  107. #define KBD_F13        213
  108. #define KBD_F14        214
  109. #define KBD_HELP    215
  110. #define KBD_DO        216
  111. #define KBD_F17        217
  112. #define KBD_F18        218
  113. #define KBD_F19        219
  114. #define KBD_F20        220
  115.  
  116. #define KBD_FIND    221
  117. #define KBD_INSERT    222
  118. #define KBD_REMOVE    223
  119. #define KBD_SELECT    224
  120. #define KBD_PREVIOUS    225
  121. #define KBD_NEXT    226
  122.  
  123. #define KBD_KP_ENTER    227
  124. #define KBD_KP_F1    228
  125. #define KBD_KP_F2    229
  126. #define KBD_KP_F3    230
  127. #define KBD_KP_F4    231
  128. #define KBD_LEFT    232
  129. #define KBD_RIGHT    233
  130. #define KBD_DOWN    234
  131. #define KBD_UP        235
  132.  
  133. #define KBD_CONTROL    236
  134. #define KBD_SHIFT    237
  135. #define KBD_CAPSLOCK    238
  136. #define KBD_ALTERNATE    239
  137.  
  138. #define KBD_MAX_VALUE    KBD_ALTERNATE
  139.  
  140. /*
  141.  * Keyboard to Ascii, unshifted. 
  142.  */
  143. static unsigned char unshiftedAscii[] = {
  144. /*  0 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  145. /*  4 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  146. /*  8 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  147. /*  c */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  148. /* 10 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  149. /* 14 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  150. /* 18 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  151. /* 1c */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  152. /* 20 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  153. /* 24 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  154. /* 28 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  155. /* 2c */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  156. /* 30 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  157. /* 34 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  158. /* 38 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  159. /* 3c */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  160. /* 40 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  161. /* 44 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  162. /* 48 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  163. /* 4c */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  164. /* 50 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  165. /* 54 */ KBD_NOKEY,    KBD_NOKEY,    KBD_F1,        KBD_F2,
  166. /* 58 */ KBD_F3,    KBD_F4,        KBD_F5,        KBD_NOKEY,
  167. /* 5c */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  168. /* 60 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  169. /* 64 */ KBD_F6,    KBD_F7,        KBD_F8,        KBD_F9,
  170. /* 68 */ KBD_F10,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  171. /* 6c */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  172. /* 70 */ KBD_NOKEY,    KBD_F11,    KBD_F12,    KBD_F13,
  173. /* 74 */ KBD_F14,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  174. /* 78 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  175. /* 7c */ KBD_HELP,    KBD_DO,        KBD_NOKEY,    KBD_NOKEY,
  176. /* 80 */ KBD_F17,    KBD_F18,    KBD_F19,    KBD_F20,
  177. /* 84 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  178. /* 88 */ KBD_NOKEY,    KBD_NOKEY,    KBD_FIND,    KBD_INSERT,
  179. /* 8c */ KBD_REMOVE,    KBD_SELECT,    KBD_PREVIOUS,    KBD_NEXT,
  180. /* 90 */ KBD_NOKEY,    KBD_NOKEY,    '0',        KBD_NOKEY,
  181. /* 94 */ '.',        KBD_KP_ENTER,    '1',        '2',
  182. /* 98 */ '3',        '4',        '5',        '6',
  183. /* 9c */ ',',        '7',        '8',        '9',
  184. /* a0 */ '-',        KBD_KP_F1,    KBD_KP_F2,    KBD_KP_F3,
  185. /* a4 */ KBD_KP_F4,    KBD_NOKEY,    KBD_NOKEY,    KBD_LEFT,
  186. /* a8 */ KBD_RIGHT,    KBD_DOWN,     KBD_UP,        KBD_NOKEY,
  187. /* ac */ KBD_NOKEY,    KBD_NOKEY,    KBD_SHIFT,    KBD_CONTROL,
  188. /* b0 */ KBD_CAPSLOCK,    KBD_ALTERNATE,    KBD_NOKEY,    KBD_NOKEY,
  189. /* b4 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  190. /* b8 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  191. /* bc */ KBD_DEL,    KBD_RET,    KBD_TAB,    '`',
  192. /* c0 */ '1',        'q',        'a',        'z',
  193. /* c4 */ KBD_NOKEY,    '2',        'w',        's',
  194. /* c8 */ 'x',        '<',        KBD_NOKEY,    '3',
  195. /* cc */ 'e',        'd',        'c',        KBD_NOKEY,
  196. /* d0 */ '4',        'r',        'f',        'v',
  197. /* d4 */ ' ',        KBD_NOKEY,    '5',        't',
  198. /* d8 */ 'g',        'b',        KBD_NOKEY,    '6',
  199. /* dc */ 'y',        'h',        'n',        KBD_NOKEY,
  200. /* e0 */ '7',        'u',        'j',        'm',
  201. /* e4 */ KBD_NOKEY,    '8',        'i',        'k',
  202. /* e8 */ ',',        KBD_NOKEY,    '9',        'o',
  203. /* ec */ 'l',        '.',        KBD_NOKEY,    '0',
  204. /* f0 */ 'p',        KBD_NOKEY,    ';',        '/',
  205. /* f4 */ KBD_NOKEY,    '=',        ']',        '\\',
  206. /* f8 */ KBD_NOKEY,    '-',        '[',        '\'',
  207. /* fc */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  208. };
  209.  
  210. /*
  211.  * Keyboard to Ascii, shifted.
  212.  */
  213. static unsigned char shiftedAscii[] = {
  214. /*  0 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  215. /*  4 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  216. /*  8 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  217. /*  c */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  218. /* 10 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  219. /* 14 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  220. /* 18 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  221. /* 1c */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  222. /* 20 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  223. /* 24 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  224. /* 28 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  225. /* 2c */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  226. /* 30 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  227. /* 34 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  228. /* 38 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  229. /* 3c */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  230. /* 40 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  231. /* 44 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  232. /* 48 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  233. /* 4c */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  234. /* 50 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  235. /* 54 */ KBD_NOKEY,    KBD_NOKEY,    KBD_F1,        KBD_F2,
  236. /* 58 */ KBD_F3,    KBD_F4,        KBD_F5,        KBD_NOKEY,
  237. /* 5c */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  238. /* 60 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  239. /* 64 */ KBD_F6,    KBD_F7,        KBD_F8,        KBD_F9,
  240. /* 68 */ KBD_F10,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  241. /* 6c */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  242. /* 70 */ KBD_NOKEY,    KBD_F11,    KBD_F12,    KBD_F13,
  243. /* 74 */ KBD_F14,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  244. /* 78 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  245. /* 7c */ KBD_HELP,    KBD_DO,        KBD_NOKEY,    KBD_NOKEY,
  246. /* 80 */ KBD_F17,    KBD_F18,    KBD_F19,    KBD_F20,
  247. /* 84 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  248. /* 88 */ KBD_NOKEY,    KBD_NOKEY,    KBD_FIND,    KBD_INSERT,
  249. /* 8c */ KBD_REMOVE,    KBD_SELECT,    KBD_PREVIOUS,    KBD_NEXT,
  250. /* 90 */ KBD_NOKEY,    KBD_NOKEY,    '0',        KBD_NOKEY,
  251. /* 94 */ '.',        KBD_KP_ENTER,    '1',        '2',
  252. /* 98 */ '3',        '4',        '5',        '6',
  253. /* 9c */ ',',        '7',        '8',        '9',
  254. /* a0 */ '-',        KBD_KP_F1,    KBD_KP_F2,    KBD_KP_F3,
  255. /* a4 */ KBD_KP_F4,    KBD_NOKEY,    KBD_NOKEY,    KBD_LEFT,
  256. /* a8 */ KBD_RIGHT,    KBD_DOWN,     KBD_UP,        KBD_NOKEY,
  257. /* ac */ KBD_NOKEY,    KBD_NOKEY,    KBD_SHIFT,    KBD_CONTROL,
  258. /* b0 */ KBD_CAPSLOCK,    KBD_ALTERNATE,    KBD_NOKEY,    KBD_NOKEY,
  259. /* b4 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  260. /* b8 */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  261. /* bc */ KBD_DEL,    KBD_RET,    KBD_TAB,    '~',
  262. /* c0 */ '!',        'q',        'a',        'z',
  263. /* c4 */ KBD_NOKEY,    '@',        'w',        's',
  264. /* c8 */ 'x',        '>',        KBD_NOKEY,    '#',
  265. /* cc */ 'e',        'd',        'c',        KBD_NOKEY,
  266. /* d0 */ '$',        'r',        'f',        'v',
  267. /* d4 */ ' ',        KBD_NOKEY,    '%',        't',
  268. /* d8 */ 'g',        'b',        KBD_NOKEY,    '^',
  269. /* dc */ 'y',        'h',        'n',        KBD_NOKEY,
  270. /* e0 */ '&',        'u',        'j',        'm',
  271. /* e4 */ KBD_NOKEY,    '*',        'i',        'k',
  272. /* e8 */ ',',        KBD_NOKEY,    '(',        'o',
  273. /* ec */ 'l',        '.',        KBD_NOKEY,    ')',
  274. /* f0 */ 'p',        KBD_NOKEY,    ':',        '?',
  275. /* f4 */ KBD_NOKEY,    '+',        '}',        '|',
  276. /* f8 */ KBD_NOKEY,    '_',        '{',        '"',
  277. /* fc */ KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,    KBD_NOKEY,
  278. };
  279.  
  280.  
  281. /*
  282.  * ----------------------------------------------------------------------------
  283.  *
  284.  * DevDC7085Reset --
  285.  *
  286.  *    Reset the chip.
  287.  *
  288.  * Results:
  289.  *    None.
  290.  *
  291.  * Side effects:
  292.  *    None.
  293.  *
  294.  * ----------------------------------------------------------------------------
  295.  */
  296. void
  297. DevDC7085Reset()
  298. {
  299.     *csrPtr = CSR_CLR;
  300.     while ((*csrPtr & CSR_CLR) != 0) {
  301.     }
  302.     *csrPtr = CSR_MSE | CSR_TIE | CSR_RIE;
  303. }
  304.  
  305. static void RecvIntr(), XmitIntr();
  306.  
  307. /*
  308.  * ----------------------------------------------------------------------------
  309.  *
  310.  * Dev_DC7085Interrupt --
  311.  *
  312.  *    Service an interrupt from the uart.
  313.  *
  314.  * Results:
  315.  *    None.
  316.  *
  317.  * Side effects:
  318.  *    Adds serial, keyboard or mouse events to the queue.
  319.  *
  320.  * ----------------------------------------------------------------------------
  321.  */
  322. /*ARGSUSED*/
  323. ENTRY void
  324. Dev_DC7085Interrupt(statusReg, causeReg, pc, data)
  325.     unsigned int statusReg;
  326.     unsigned int causeReg;
  327.     Address pc;
  328.     ClientData data;
  329. {
  330.     MASTER_LOCK(&dc7085Mutex);
  331.  
  332.     if (*csrPtr & CSR_RDONE) {
  333.     RecvIntr();
  334.     }
  335.  
  336.     if (*csrPtr & CSR_TRDY) {
  337.     XmitIntr();
  338.     }
  339.  
  340.     MASTER_UNLOCK(&dc7085Mutex);
  341. }
  342.  
  343. static Boolean    shiftDown = FALSE;
  344. static Boolean    ctrlDown = FALSE;
  345. static Boolean    consoleCmd = FALSE;
  346. static unsigned char lastChar = 0;
  347. static Time    consoleCmdTime;
  348.  
  349.  
  350. /*
  351.  *----------------------------------------------------------------------
  352.  *
  353.  * RecvIntr --
  354.  *
  355.  *    Process a received character.
  356.  *
  357.  * Results:
  358.  *    None.
  359.  *
  360.  * Side effects:
  361.  *    Events added to the queue.
  362.  *
  363.  *----------------------------------------------------------------------
  364.  */
  365. ENTRY static void
  366. RecvIntr()
  367. {
  368.     unsigned short    recvBuf;
  369.     unsigned char    ch;
  370.     unsigned char    asciiChar;
  371.  
  372.     while (*csrPtr & CSR_RDONE) {
  373.     recvBuf = *rBufPtr;
  374.     ch = recvBuf & 0xFF;
  375.  
  376.     switch ((recvBuf & RBUF_LINE_NUM) >> RBUF_LINE_NUM_SHIFT) {
  377.         case KBD_PORT: {
  378.         if (devGraphicsOpen && !devDivertXInput) {
  379.             MASTER_UNLOCK(&dc7085Mutex);
  380.             DevGraphicsKbdIntr(ch);
  381.             MASTER_LOCK(&dc7085Mutex);
  382.             break;
  383.         }
  384.         if (ch != KEY_REPEAT) {
  385.             if (ch == KEY_UP) {
  386.             shiftDown = FALSE;
  387.             ctrlDown = FALSE;
  388.             break;
  389.             } else {
  390.             if (ch == KEY_SHIFT) {
  391.                 shiftDown = TRUE;
  392.                 break;
  393.             } else if (ch == KEY_CONTROL) {
  394.                 ctrlDown = TRUE;
  395.                 break;
  396.             } else if (ch == KEY_COMMAND) {
  397.                 consoleCmd = TRUE;
  398.                 Timer_GetTimeOfDay(&consoleCmdTime, (int *)NIL,
  399.                            (Boolean *)NIL);
  400.                 break;
  401.             }
  402.             }
  403.             lastChar = ch;
  404.         } else {
  405.             ch = lastChar;
  406.         }
  407.  
  408.         asciiChar = DevDC7085TranslateKey(ch, shiftDown, ctrlDown);
  409.         if (asciiChar != (unsigned char) -1) {
  410.             if (consoleCmd) {
  411.             Time curTime, diff;
  412.  
  413.             consoleCmd = FALSE;
  414.             Timer_GetTimeOfDay(&curTime, (int *)NIL,(Boolean *)NIL);
  415.             Time_Subtract(curTime, consoleCmdTime, &diff);
  416.             if (diff.seconds <= CONSOLE_CMD_INTERVAL) {
  417.                 Dev_InvokeConsoleCmd(asciiChar);
  418.             } else {
  419.                 (*devKeyboard.inputProc)(devKeyboard.inputData, 
  420.                              asciiChar);
  421.             }
  422.             } else {
  423.             (*devKeyboard.inputProc)(devKeyboard.inputData, 
  424.                          asciiChar);
  425.             }
  426.         }
  427.         break;
  428.         }
  429.         case MOUSE_PORT:
  430.         if (devGraphicsOpen && !devDivertXInput) {
  431.             MASTER_UNLOCK(&dc7085Mutex);
  432.             DevGraphicsMouseIntr(ch);
  433.             MASTER_LOCK(&dc7085Mutex);
  434.         }
  435.         break;
  436.         case MODEM_PORT:
  437.         (*devSerialA.inputProc)(devSerialA.inputData, ch);
  438.         break;
  439.         case PRINTER_PORT:
  440.         (*devSerialB.inputProc)(devSerialB.inputData, ch);
  441.         break;
  442.     }
  443.     }
  444. }
  445.  
  446.  
  447. /*
  448.  *----------------------------------------------------------------------
  449.  *
  450.  * DevDC7085TranslateKey --
  451.  *
  452.  *    Translate a key code to an ascii character.
  453.  *
  454.  * Results:
  455.  *    The ascii character, -1 if couldn't translate it.
  456.  *
  457.  * Side effects:
  458.  *    None.
  459.  *
  460.  *----------------------------------------------------------------------
  461.  */
  462. char 
  463. DevDC7085TranslateKey(ch, shiftDown, ctrlDown)
  464.     unsigned char    ch;
  465.     Boolean    shiftDown;
  466.     Boolean    ctrlDown;
  467. {
  468.     char asciiChar;
  469.  
  470.     if (shiftDown) {
  471.     asciiChar = shiftedAscii[ch];
  472.     } else {
  473.     asciiChar = unshiftedAscii[ch];
  474.     }
  475.     if (asciiChar >= KBD_NOKEY) {
  476.     /*
  477.      * A function key was typed - ignore it.
  478.      */
  479.     return(-1);
  480.     } else if (asciiChar > KBD_MAX_VALUE) {
  481.     printf("DevDC7085TranslateKey: Bad key code raw: %d, mapped: %d\n",
  482.             ch, asciiChar);
  483.     return(-1);
  484.     } else {
  485.     if (asciiChar >= 'a' && asciiChar <= 'z') {
  486.         if (ctrlDown) {
  487.         asciiChar = asciiChar - 'a' + '';
  488.         } else if (shiftDown) {
  489.         asciiChar = asciiChar - 'a' + 'A';
  490.         }
  491.     } else if (ctrlDown) {
  492.         if (asciiChar >= '[' && asciiChar <= '_') {
  493.         asciiChar = asciiChar - '@';
  494.         } else if (asciiChar == ' ' || asciiChar == '@') {
  495.         asciiChar = '\0'; 
  496.         }
  497.     }
  498.     }
  499.  
  500.     return(asciiChar);
  501. }
  502.  
  503.  
  504. /*
  505.  *----------------------------------------------------------------------
  506.  *
  507.  * XmitIntr --
  508.  *
  509.  *    Handle a transmission interrupt.
  510.  *
  511.  * Results:
  512.  *    None.
  513.  *
  514.  * Side effects:
  515.  *    None.
  516.  *
  517.  *----------------------------------------------------------------------
  518.  */
  519. static void
  520. XmitIntr()
  521. {
  522.     int c;
  523.     int lineNum;
  524.  
  525.     if (!(*csrPtr & CSR_TRDY)) {
  526.     printf("XmitIntr: Spurious interrupt\n");
  527.     return;
  528.     }
  529.     lineNum = *csrPtr >> 8;
  530.     switch (lineNum & 0x3) {
  531.     case KBD_PORT:
  532.         break;
  533.     case MODEM_PORT:
  534.         c = (int) (*devSerialA.outputProc)(devSerialA.outputData);
  535.         if (c == -1) {
  536.         *tcrPtr &= ~(1 << MODEM_PORT);
  537.         devSerialA.flags &= ~XMIT_ENABLED;
  538.         } else {
  539.         *tdrPtr = breakVal | c;
  540.         }
  541.         break;
  542.     case PRINTER_PORT:
  543.         c = (int) (*devSerialB.outputProc)(devSerialB.outputData);
  544.         if (c == -1) {
  545.         *tcrPtr &= ~(1 << PRINTER_PORT);
  546.         devSerialB.flags &= ~XMIT_ENABLED;
  547.         } else {
  548.         *tdrPtr = breakVal | c;
  549.         }
  550.         break;
  551.     }
  552. }
  553.  
  554.  
  555. /*
  556.  *----------------------------------------------------------------------
  557.  *
  558.  * DevDC7085Activate --
  559.  *
  560.  *    This procedure is invoked in order to "activate" one half of a
  561.  *    DC7085 chip.
  562.  *
  563.  * Results:
  564.  *    None.
  565.  *
  566.  * Side effects:
  567.  *    The channel is re-initialized and the receiver is started.
  568.  *
  569.  *----------------------------------------------------------------------
  570.  */
  571. ENTRY void
  572. DevDC7085Activate(dcPtr)
  573.     register DevDC7085 *dcPtr;        /* Information about the device. */
  574. {
  575.     MASTER_LOCK(&dc7085Mutex);
  576.  
  577.     switch (dcPtr->port) {
  578.     case KBD_PORT:
  579.         if (!(dcPtr->flags & LINE_ACTIVE)) {
  580.         *lprPtr = LPR_RXENAB | LPR_B4800 | LPR_8_BIT_CHAR | KBD_PORT;
  581.         dcPtr->flags |= LINE_ACTIVE;
  582.         }
  583.         break;
  584.     case MODEM_PORT:
  585.     case PRINTER_PORT:
  586.         if (!(dcPtr->flags & LINE_ACTIVE)) {
  587.         *lprPtr = LPR_RXENAB | BaudToReg(dcPtr->baud) | 
  588.                  LPR_8_BIT_CHAR | dcPtr->port;
  589.         dcPtr->flags |= LINE_ACTIVE;
  590.         }
  591.         break;
  592.     }
  593.  
  594.     MASTER_UNLOCK(&dc7085Mutex);
  595. }
  596.  
  597.  
  598. /*
  599.  *----------------------------------------------------------------------
  600.  *
  601.  * DevDC7085RawProc --
  602.  *
  603.  *    This procedure is called back from the Td module as a raw
  604.  *    control procedure.
  605.  *
  606.  * Results:
  607.  *    The return value is the number of bytes returned to the caller
  608.  *    at outBuffer.
  609.  *
  610.  * Side effects:
  611.  *    Depends on the control operation.  Most likely effect is to
  612.  *    start transferring output data.
  613.  *
  614.  *----------------------------------------------------------------------
  615.  */
  616.  
  617. /* ARGSUSED */
  618. ENTRY int
  619. DevDC7085RawProc(dcPtr, operation, inBufSize, inBuffer, outBufSize, outBuffer)
  620.     register DevDC7085 *dcPtr;    /* Our information about device. */
  621.     int operation;        /* What to do:  TD_RAW_OUTPUT_READY etc. */
  622.     int inBufSize;        /* Size of input buffer for operation. */
  623.     char *inBuffer;        /* Input buffer. */
  624.     int outBufSize;        /* Size of output buffer for operation. */
  625.     char *outBuffer;        /* Output buffer. */
  626. {
  627.     int result = 0;
  628.  
  629.     MASTER_LOCK(&dc7085Mutex);
  630.  
  631.     switch (operation) {
  632.     case TD_RAW_START_BREAK:
  633.         breakVal |= 1 << (dcPtr->port + 8);
  634.         *tdrPtr = breakVal;
  635.         break;
  636.  
  637.     case TD_RAW_STOP_BREAK:
  638.         breakVal &= ~(1 << (dcPtr->port + 8));
  639.         *tdrPtr = breakVal;
  640.         break;
  641.  
  642.     case TD_RAW_SET_DTR:
  643.         if (dcPtr->port == MODEM_PORT) {
  644.         *tcrPtr |= TCR_DTR2;
  645.         }
  646.         break;
  647.  
  648.     case TD_RAW_CLEAR_DTR:
  649.         if (dcPtr->port == MODEM_PORT) {
  650.         *tcrPtr &= ~TCR_DTR2;
  651.         }
  652.         break;
  653.  
  654.     case TD_RAW_SHUTDOWN:
  655.         if (dcPtr->port==PRINTER_PORT || dcPtr->port==MODEM_PORT) {
  656.         /* SHUTDOWN seems to mess up the printer. */
  657.         break;
  658.         }
  659.         if (dcPtr->flags & LINE_ACTIVE) {
  660.         *lprPtr = dcPtr->port;
  661.         dcPtr->flags &= ~LINE_ACTIVE;
  662.         *tcrPtr &= ~(1 << dcPtr->port);
  663.         }
  664.         break;
  665.  
  666.     case TD_RAW_OUTPUT_READY:
  667.         if (!(dcPtr->flags & XMIT_ENABLED)) {
  668.         *tcrPtr |= 1 << dcPtr->port;
  669.         dcPtr->flags |= XMIT_ENABLED;
  670.         }
  671.         break;
  672.  
  673.     case TD_RAW_FLUSH_OUTPUT:
  674.         while ((*dcPtr->outputProc)(dcPtr->outputData) != -1) {
  675.         /* do nothing */
  676.         }
  677.         break;
  678.  
  679.     case TD_RAW_FLOW_CHARS:
  680.         /* Ignore flow-control chars. */
  681.         break;
  682.  
  683.     case TD_RAW_SET_BAUD_RATE: {
  684.         Td_BaudRate *brPtr;
  685.         int        i;
  686.  
  687.         /*
  688.          * Map the baud rate from an sgttyb constant to an actual
  689.          * number.  Return the value we actually set things to.
  690.          */
  691.  
  692.         brPtr = (Td_BaudRate *) inBuffer;
  693.         for (i = 0; baudMap[i].baud != -1; i++) {
  694.         if (baudMap[i].sgttybVal == brPtr->ospeed) {
  695.             dcPtr->baud = baudMap[i].baud;
  696.             break;
  697.         }
  698.         }
  699.         switch (dcPtr->port) {
  700.         case MODEM_PORT:
  701.             *lprPtr = LPR_RXENAB | BaudToReg(dcPtr->baud) | 
  702.                  LPR_8_BIT_CHAR | MODEM_PORT;
  703.             break;
  704.         case PRINTER_PORT:
  705.             *lprPtr = LPR_RXENAB | BaudToReg(dcPtr->baud) |
  706.                  LPR_8_BIT_CHAR | PRINTER_PORT;
  707.             break;
  708.         }
  709.  
  710.         /*
  711.          * Fall through to next arm of case to return current
  712.          * settings.
  713.          */
  714.     }
  715.  
  716.     case TD_RAW_GET_BAUD_RATE: {
  717.         int i;
  718.         Td_BaudRate *brPtr;
  719.  
  720.         brPtr = (Td_BaudRate *) outBuffer;
  721.         if (outBufSize >= sizeof(Td_BaudRate)) {
  722.         for (i = 0; baudMap[i].baud != -1; i++) {
  723.             if (baudMap[i].baud == dcPtr->baud) {
  724.             brPtr->ispeed = brPtr->ospeed = baudMap[i].sgttybVal;
  725.             result = sizeof(Td_BaudRate);
  726.             }
  727.         }
  728.         }
  729.         break;
  730.     }
  731.     }
  732.     MASTER_UNLOCK(&dc7085Mutex);
  733.     return result;
  734. }
  735.  
  736.  
  737. /*
  738.  *----------------------------------------------------------------------
  739.  *
  740.  * BaudToReg --
  741.  *
  742.  *    Map from a raw baud rate to the value to shove into the register.
  743.  *
  744.  * Results:
  745.  *    The baud value to shove into the register.
  746.  *
  747.  * Side effects:
  748.  *    None.
  749.  *
  750.  *----------------------------------------------------------------------
  751.  */
  752. int
  753. BaudToReg(baud)
  754.     int    baud;
  755. {
  756.     int    i = 0;
  757.  
  758.     while (baudMap[i].baud != baud && baudMap[i].baud != -1) {
  759.     i++;
  760.     }
  761.     return(baudMap[i].regVal);
  762. }
  763.  
  764.  
  765. /*
  766.  * ----------------------------------------------------------------------------
  767.  *
  768.  * DevDC7085MouseInit --
  769.  *
  770.  *    Initialize the mouse.
  771.  *
  772.  * Results:
  773.  *    None.
  774.  *
  775.  * Side effects:
  776.  *    The mouse is initialized.
  777.  *
  778.  * ----------------------------------------------------------------------------
  779.  */
  780. ENTRY void
  781. DevDC7085MouseInit()
  782. {
  783.     MASTER_LOCK(&dc7085Mutex);
  784.  
  785.     *lprPtr = LPR_RXENAB | LPR_B4800 | LPR_OPAR | LPR_PARENB |
  786.                LPR_8_BIT_CHAR | MOUSE_PORT;
  787.  
  788.     Mach_SetIOHandler(7, Dev_DC7085Interrupt, (ClientData) NIL);
  789.     MASTER_UNLOCK(&dc7085Mutex);
  790. }
  791.  
  792.  
  793. /*
  794.  * ----------------------------------------------------------------------------
  795.  *
  796.  * DevDC7085MousePutCh --
  797.  *
  798.  *    Write a character to the mouse.  This is only called at initialization
  799.  *    time.
  800.  *
  801.  * Results:
  802.  *    None.
  803.  *
  804.  * Side effects:
  805.  *    A character is written to the mouse.
  806.  *
  807.  * ----------------------------------------------------------------------------
  808.  */
  809. ENTRY void
  810. DevDC7085MousePutCh(c)
  811.     int    c;
  812. {
  813.     register    int    timeout;
  814.     register    int    reg;
  815.  
  816.     MASTER_LOCK(&dc7085Mutex);
  817.  
  818.     reg = *tcrPtr;
  819.     *tcrPtr = 0x2;
  820.     timeout = 60000;
  821.  
  822.     for (timeout = 60000;
  823.      (!(*csrPtr & CSR_TRDY) || (*csrPtr & CSR_TX_LINE_NUM) != 0x100) &&
  824.          timeout > 0;
  825.      timeout--) {
  826.     }
  827.     *tdrPtr = c & 0xff;
  828.     MACH_DELAY(50000);
  829.     *tcrPtr = reg;
  830.  
  831.     MASTER_UNLOCK(&dc7085Mutex);
  832. }
  833.  
  834.  
  835. /*
  836.  * ----------------------------------------------------------------------------
  837.  *
  838.  * DevDC7085MouseGetCh --
  839.  *
  840.  *    Read a character from the mouse.  This is only called at
  841.  *    initialization time.
  842.  *
  843.  * Results:
  844.  *    A character read from the mouse, -1 if we timed out waiting.
  845.  *
  846.  * Side effects:
  847.  *    None.
  848.  *
  849.  * ----------------------------------------------------------------------------
  850.  */
  851. ENTRY int
  852. DevDC7085MouseGetCh()
  853. {
  854.     register int        timeout;
  855.     register unsigned short    c;
  856.  
  857.     MASTER_LOCK(&dc7085Mutex);
  858.  
  859.     for (timeout = 1000000; timeout > 0; timeout--) {
  860.     if (*csrPtr & CSR_RDONE) {
  861.         c = *rBufPtr;
  862.         MACH_DELAY(50000);
  863.         if (((c >> 8) & 03) != 1) {
  864.         continue;
  865.         }
  866.         MASTER_UNLOCK(&dc7085Mutex);
  867.         return(c & 0xff);
  868.     }
  869.     }
  870.     MASTER_UNLOCK(&dc7085Mutex);
  871.  
  872.     return(-1);
  873. }
  874.  
  875.  
  876. /*
  877.  * ----------------------------------------------------------------------------
  878.  *
  879.  * DevDC7085KBDPutc --
  880.  *
  881.  *    Put a character out to the keyboard.
  882.  *
  883.  * Results:
  884.  *    None.
  885.  *
  886.  * Side effects:
  887.  *    A character is written to the keyboard.
  888.  *
  889.  * ----------------------------------------------------------------------------
  890.  */
  891. ENTRY void
  892. DevDC7085KBDPutc(c)
  893.     register int c;
  894. {
  895.     register unsigned    short    tcr;
  896.     register int    timeout;
  897.     int            line;
  898.  
  899.     MASTER_LOCK(&dc7085Mutex);
  900.  
  901.     tcr = *tcrPtr & 1;
  902.     *tcrPtr |= 1;
  903.     while (1) {
  904.         timeout = 1000000;
  905.         while (!(*csrPtr & CSR_TRDY) && timeout > 0) {
  906.             timeout--;
  907.         }
  908.         if (timeout == 0) {
  909.             break;
  910.         }
  911.         line = (*csrPtr >> 8) & 3;
  912.         if (line != 0) {
  913.             tcr |= 1 << line;
  914.             *tcrPtr &= ~(1 << line);
  915.             continue;
  916.         }
  917.         *tdrPtr = breakVal | (c & 0xff);
  918.         MACH_DELAY(5);
  919.         while (1) {
  920.             while (!(*csrPtr & CSR_TRDY)) {
  921.             }
  922.             line = (*csrPtr >> 8) & 3;
  923.             if (line != 0) {
  924.                 tcr |= 1 << line;
  925.                 *tcrPtr &= ~(1 << line);
  926.                 continue;
  927.             }
  928.             break;
  929.         }
  930.         break;
  931.     }
  932.     *tcrPtr &= ~1;
  933.     if (tcr != 0) {
  934.     *tcrPtr |= tcr;
  935.     }
  936.  
  937.     MASTER_UNLOCK(&dc7085Mutex);
  938. }
  939.  
  940.